package scanner.com.activity;
import java.util.Hashtable;
import android.graphics.Bitmap;
import android.util.Log;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

/**
 * @类功能说明: 生成二维码图片示例
 */
public class QRUtils {

    /**
     * 将文本编码成二维码的位矩阵图，用法为
     * @param text
     * @param width
     * @param height
     * @return
     */
    public static BitMatrix createQRBitMatrix(String text,int width, int height){
        try {
            // 判断URL合法性
            if (text == null || "".equals(text) || text.length() < 1) 	return null;
            Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            // 图像数据转换，使用了矩阵转换
            return new QRCodeWriter().encode(text,BarcodeFormat.QR_CODE, width, height, hints);
        } catch (WriterException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将文本转换为二维码Bitmap
     * @param text 要转换的地址或字符串,可以是中文
     * @param qrcolor
     * @param bgcolor
     * @param width
     * @param height
     * @return
     */
    public static Bitmap createQRImage(String text, int qrcolor, int bgcolor,int width, int height) {
        BitMatrix bitMatrix = createQRBitMatrix(text,width,height);
        int[] pixels = new int[width * height];
        // 下面这里按照二维码的算法，逐个生成二维码的像素点，两个for循环是图片横列扫描的结果
        for (int y = 0; y < width; y++) {
            for (int x = 0; x < width; x++) {
                if (bitMatrix.get(x, y)) {
                    pixels[y * width + x] = qrcolor;
                } else {
                    pixels[y * width + x] = bgcolor;
                }
            }
        }
        // 生成二维码图片的格式，使用ARGB_8888
        Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
        return bitmap;
    }
    /**
     * 将文本转换为二维码的文本型字符串。即用文本排列出二维码样式，用例：createQRText("text","■","  ",21,21);
     * @param text 要转换的地址或字符串,可以是中文
     * @param qrChar 二维码数据用什么字符表示 ，例如■
     * @param bgChar 背景用什么字符表示 例如'  '
     * @param width
     * @param height
     * @return
     */
    public static String createQRText(String text, String qrChar, String bgChar,int width, int height) {
        BitMatrix bitMatrix = createQRBitMatrix(text,width,height);
        // 下面这里按照二维码的算法，逐个生成二维码的像素点，两个for循环是图片横列扫描的结果
        StringBuffer sb = new StringBuffer();
        for (int y = 0; y < width; y++) {
            for (int x = 0; x < width; x++) {
                if (bitMatrix.get(x, y)) {
                    sb.append(qrChar);
                } else {
                    sb.append(bgChar);
                }
            }
            sb.append("\n");
        }
        return sb.toString();
    }
    /**
     * 将文本转换为二维码的文本型字符串。即用文本排列出二维码样式，
     * @param text 要转换的地址或字符串,可以是中文
     * @param width
     * @param height
     * @return
     */
    public static String createQRText(String text,int width, int height) {
        BitMatrix bitMatrix = createQRBitMatrix(text,width,height);
        int[] pixels = new int[width * height];
        // 下面这里按照二维码的算法，逐个生成二维码的像素点，两个for循环是图片横列扫描的结果
        StringBuffer sb = new StringBuffer();
        for (int y = 0; y < width; y++) {
            for (int x = 0; x < width; x++) {
                if (bitMatrix.get(x, y)) {
                    sb.append("■");
                } else {
                    sb.append("  ");
                }
            }
            sb.append("\n");
        }
        return sb.toString();
    }
}

